/*******************************************************************************
* Copyright (c) 2004, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.session;
import java.util.List;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.MUILabel;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.ViewSite;
/**
* Bug 108033 Need a test to ensure that view tab order is the same on start up
* as it was in the last session.
*
* These tests more or less depend on being run in order. The workspace exists
* from method to method.
*
* @since 3.2
*
*/
public class Bug108033Test extends TestCase {
public static TestSuite suite() {
TestSuite ts = new TestSuite("org.eclipse.ui.tests.session.Bug108033Test");
ts.addTest(new Bug108033Test("testShowMultipleViews"));
ts.addTest(new Bug108033Test("testCheckMultipleViews"));
ts.addTest(new Bug108033Test("testMovedMultipleViews"));
return ts;
}
public static final String PROBLEM_VIEW_ID = "org.eclipse.ui.views.ProblemView";
public static final String TASK_VIEW_ID = "org.eclipse.ui.views.TaskList";
public static final String PROGRESS_VIEW_ID = "org.eclipse.ui.views.ProgressView";
private static String RESOURCE_ID = "org.eclipse.ui.resourcePerspective";
private IWorkbenchWindow fWin;
private IWorkbenchPage fActivePage;
private IWorkbench fWorkbench;
public Bug108033Test(String testName) {
super(testName);
}
@Override
protected void setUp() throws Exception {
fWorkbench = PlatformUI.getWorkbench();
fWin = fWorkbench.getActiveWorkbenchWindow();
fActivePage = fWin.getActivePage();
}
/**
* Make sure the perspective has been reset, and then show the views in the
* expected order. These tests depend on being run in order in the same
* environment, so we can't use the standard openWindow() to protect
* ourselves from side effects.
*
* @throws Throwable
* an error
*/
public void testShowMultipleViews() throws Throwable {
IPerspectiveDescriptor desc = fActivePage.getWorkbenchWindow()
.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(
RESOURCE_ID);
fActivePage.setPerspective(desc);
fActivePage.resetPerspective();
assertNotNull(fActivePage.showView(TASK_VIEW_ID));
assertNotNull(fActivePage.showView(PROGRESS_VIEW_ID));
assertNotNull(fActivePage.showView(PROBLEM_VIEW_ID));
}
/**
* Check the views are still in the correct order, then move the problems
* view to the first tab.
*
* @throws Throwable
* an error
*/
public void testCheckMultipleViews() throws Throwable {
IViewPart problemView = instantiateViews();
ViewSite site = (ViewSite) problemView.getSite();
MElementContainer<MUIElement> stack = getParent(site.getModel());
verifyOrder(stack, new String[] { "Tasks", "Progress", "Problems" });
moveTab(stack, problemView, 0);
verifyOrder(stack, new String[] { "Problems", "Tasks", "Progress" });
}
// TBD should this be in the ModelService or PartService?
private MElementContainer<MUIElement> getParent(MUIElement element) {
MElementContainer<MUIElement> parent = element.getParent();
if (parent != null) {
return parent;
}
MPlaceholder placeholder = element.getCurSharedRef();
if (placeholder != null) {
return placeholder.getParent();
}
return null;
}
private void moveTab(MElementContainer<MUIElement> stack, IViewPart viewPart, int indexTo) {
ViewSite site = (ViewSite) viewPart.getSite();
MPart part = site.getModel();
List<MUIElement> children = stack.getChildren();
int indexFrom = children.indexOf(part);
assertTrue(indexFrom >= 0);
children.remove(part);
children.add(indexTo, part);
stack.setSelectedElement(part);
}
/**
* Verify the views are ordered with the problems view first after the
* restart.
*
* @throws Throwable
* an error
*/
public void testMovedMultipleViews() throws Throwable {
IViewPart problemView = instantiateViews();
ViewSite site = (ViewSite) problemView.getSite();
MElementContainer<MUIElement> stack = getParent(site.getModel());
verifyOrder(stack, new String[] { "Problems", "Tasks", "Progress" });
}
/**
* Removes any NPEs.
*
* @return the problem view.
* @throws PartInitException
* if a view fails to instantiate.
*/
private IViewPart instantiateViews() throws PartInitException {
IViewPart problemView = fActivePage.showView(PROBLEM_VIEW_ID);
assertNotNull(problemView);
// make sure all of the views have been instantiated
assertNotNull(fActivePage.showView(PROGRESS_VIEW_ID));
assertNotNull(fActivePage.showView(TASK_VIEW_ID));
return problemView;
}
/**
* Verify the tabs are in the correct order.
*
* @param pres
* the stack presentation
* @param order
* the expected order
*/
private void verifyOrder(MElementContainer<MUIElement> stack, String[] order) {
List<MUIElement> children = stack.getChildren();
assertEquals("Different number of tabs", order.length, children.size());
for (int i = 0; i < children.size(); ++i) {
MUIElement child = children.get(i);
if (child instanceof MPlaceholder) {
child = ((MPlaceholder) child).getRef();
}
assertEquals("Failed on tab " + i, order[i], ((MUILabel)child).getLabel());
}
}
}